package com.robotic.common.utils.http;

import okhttp3.*;
import java.io.IOException;
import java.util.Map;
import java.util.concurrent.TimeUnit;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;


public class EnhancedHttpUtils {

    private static final Logger log = LoggerFactory.getLogger(EnhancedHttpUtils.class);

    // OkHttpClient 应该被重用，而不是每次请求都新建
    private static final OkHttpClient CLIENT = new OkHttpClient.Builder()
            .connectTimeout(10, TimeUnit.SECONDS) // 连接超时
            .readTimeout(30, TimeUnit.SECONDS)    // 读取超时
            .writeTimeout(30, TimeUnit.SECONDS)   // 写入超时
            .build();

    // MIME 类型常量
    public static final MediaType JSON_MEDIA_TYPE = MediaType.parse("application/json; charset=utf-8");
    public static final MediaType FORM_MEDIA_TYPE = MediaType.parse("application/x-www-form-urlencoded; charset=utf-8");

    /**
     * 发送 POST 请求（默认：表单形式：application/x-www-form-urlencoded）
     * * @param url 发送请求的 URL
     * @param params 请求参数的 Map<String, String> 集合
     * @return 所代表远程资源的响应结果
     */
    public static String sendPost(String url, Map<String, String> params) {
        // 构建表单体
        FormBody.Builder formBuilder = new FormBody.Builder();
        for (Map.Entry<String, String> entry : params.entrySet()) {
            formBuilder.add(entry.getKey(), entry.getValue());
        }
        RequestBody requestBody = formBuilder.build();

        return executePost(url, requestBody);
    }

    /**
     * 发送 POST 请求（JSON 形式：application/json）
     * * @param url 发送请求的 URL
     * @param jsonBody JSON 格式的字符串请求体
     * @return 所代表远程资源的响应结果
     */
    public static String sendPostJson(String url, String jsonBody) {
        // 构建 JSON 请求体
        RequestBody requestBody = RequestBody.create(jsonBody, JSON_MEDIA_TYPE);

        return executePost(url, requestBody);
    }

    /**
     * 核心执行方法，处理请求的发送和结果获取
     *
     * @param url 请求 URL
     * @param requestBody 请求体
     * @return 响应结果字符串
     */
    private static String executePost(String url, RequestBody requestBody) {
        log.info("sendPost - {}", url);

        Request request = new Request.Builder()
                .url(url)
                // 推荐添加的通用请求头
                .header("User-Agent", "OkHttp-Enhanced-Client")
                .post(requestBody)
                .build();

        try (Response response = CLIENT.newCall(request).execute()) {
            // 检查响应是否成功（HTTP 状态码 200-299）
            if (!response.isSuccessful()) {
                throw new IOException("Unexpected code " + response);
            }

            // 获取响应体并返回
            String result = response.body().string();
            log.info("recv - {}", result);
            return result;

        } catch (IOException e) {
            // OkHttp 已经将各种网络错误（连接、超时等）统一封装为 IOException
            log.error("调用 EnhancedHttpUtils.sendPost 发生错误, url=" + url, e);
            // 生产环境中可以返回一个表示失败的特定字符串或抛出自定义异常
            return null;
        }
    }
}
